local dx_map = require("dx_map")
local logger = require("dx_logger")
local dx_json = require("dx_json")


local config = {}

local map_keys = {}

local function split(str, delimiter)
    local dLen = string.len(delimiter)
    local newDeli = ""
    for i = 1, dLen, 1 do
        newDeli = newDeli .. "[" .. string.sub(delimiter, i, i) .. "]"
    end

    local locaStart, locaEnd = string.find(str, newDeli)
    local arr = {}
    local n = 1
    while locaStart ~= nil do
        if locaStart > 0 then
            arr[n] = string.sub(str, 1, locaStart - 1)
            n = n + 1
        end

        str = string.sub(str, locaEnd + 1, string.len(str))
        locaStart, locaEnd = string.find(str, newDeli)
    end
    if str ~= nil then
        arr[n] = str
    end
    return arr
end



-- @brief 将配置持久化到文件（目前为全量替换，将内存中的配置全部持久化为json文件，下次启动优先加载文件）
-- @param nil
-- @return nil
local function config_write_file()
    -- 将___config_map转为json，写入配置文件
    -- map to json to file
    local config_tab = {}

    local keys = split(dx_map.get_keys(___config_map), ",")
    for key, value in pairs(keys) do
        config_tab[value] = config.get(value)
    end
    local config_str = dx_json.encode(config_tab)

    os.execute("mkdir -p /dx_cc101_data")
    local file = io.open("/dx_cc101_data/config.txt","w+")
    local file_bak = io.open("/dx_cc101_data/config_bak.txt","w+")
    if file == nil or file_bak == nil then
        return nil
    end
    io.output(file)
    io.write(config_str)
    io.flush()
    io.close()

    io.output(file_bak)
    io.write(config_str)
    io.flush()
    io.close()
end


-- @brief 读文件到配置（全量读取本地配置到内存map中，用于设备启动加载配置第一步）
-- @param nil
-- @return nil
local function file_read_config()
    -- 读取配置文件，将json转码为map
    local file = io.open("/dx_cc101_data/config.txt","r")
    if file == nil then
        return nil
    end
    io.input(file)
    local config_str = io.read()
    if config_str == nil then
        local file_bak = io.open("/dx_cc101_data/config_bak.txt","r")
        if file_bak == nil then
            return nil
        end
        io.input(file_bak)
        config_str = io.read()
    end

    if config_str ~= nil then
        local config_tab = dx_json.decode(config_str)
        for key, value in ipairs(config_tab) do
            config.set(key, value)
        end
    end
end


-- 初始化配置
-- 设备持久化配置文件优先级高于config_info
function config.init()
    require("config_info")
    -- 加载配置文件，重复项覆盖config_info配置
    file_read_config()
end


-- @brief 修改或新增配置
-- @param key  配置名
-- @param value  配置值
-- @return nil
function config.set(key, value)
    dx_map.set(___config_map, key, value)
    config_write_file()
end


-- @brief 获取指定配置
-- @param key  配置key
-- @return str or nil
function config.get(key)
    return dx_map.get(___config_map, key)
end


-- @brief 删除指定配置
-- @param key  配置key
-- @return nil
function config.remove_by_key(key)
    table.remove(map_keys, key)
    dx_map.remove(___config_map, key)
end


-- @brief 获取指定分组所有配置
-- @param group  配置组名
-- @return table or nil
function config.get_config_by_group(group)
    -- 根据配置分组名获取同一分组所有配置
    -- 例如group = net 则可以获取到ip、gateway的值，返回格式为table
    -- TODO 逻辑待完善
end


-- 获取所以配置
-- @brief 获取指定配置
-- @param group  配置key
-- @return table or nil
function config.get_config_all()
    -- 获取所有配置
    -- TODO 逻辑待完善
end


return config
